<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>this_arguements</title>
</head>

<body>
    <!-- 
		this 为何表示函数上下文
		函数和方法的区别
		构造函数显示返回一个对象会怎么样
		...不知道...
	 -->
    <script>
    // "use strict";
    // 'use strict';

    function a() {
        console.log(arguments)
        console.log(typeof arguments); //object;
        // arguments.forEach();
        // forEach is not a function 类数组
        // 提供我们访问所有实际参数的接口而已...
    }

    function sum() {
        var sum = 0;
        for (var i = 0; i < arguments.length; i++)
            sum += arguments[i];
        return sum;
    }
    console.log(sum());
    console.log(sum(1, 32, 213, 42));
    console.log(sum('ab', 1213, 'fsf'));
    console.log(sum('1213', 'ab', 1213, 'fsf'));
    // ... 剩余参数是一个arr实例 but arguements not
    function sumes6(...arr) {
        var sum = 0;
        arr.forEach(item => sum += item);
        return sum;
    }
    console.log(sumes6());
    console.log(sumes6(21, 342, 5235));
    console.log(sumes6('131', 3424, 'haha'));
    console.log(sumes6('i', 'am', 'nl'));
    // arguments还可以作为函数参数的别名 
    // 和 参数值 相互影响  
    // 可读性差 严格模式无法使用别名影响
    // es5引入 严格模式...
    // 
    // 'use strict';//下面不生效？en-sd
    (function(a) {
        arguments[0] = 2;
        console.log(arguments[0]);
        console.log(a);
    })(3)

    // 函数的四种调用方式
    // 		直接调用
    // 		作为方法被调用 关联在一个对象上,实现面向对象编程
    // 		作为构造函数, 实例一个新的对象
    // 		函数的apply call方法    

    function a() {};

    function b() {};
    a('w');
    (function(ww) { return ww; })('yy');
    var c = {
        b: function() {}
    };
    c.b();
    c = new b('fsf');
    // b.call(a,'fsf')
    // b.apply(a,['fsf'])
    function test() {
        console.log(this)
    }
    test();//window
    function tt(){
    	'use strict';
    	console.info(this);
    }
    tt();//undefined;

   //直接作为一个函数调用时，默认this为window 
   //而严格模式更为容易理解，undefined 并不知道我是谁 just.Fn
   
   // 作为方法被调用
   function mtd(){
   	console.log(this);
   };
   var dtm=mtd;
   mtd();
   dtm();
   var nijin={
   	hh:dtm
   }
   nijin.hh();
   // 我们只是可以通过对象的某个属性访问函数而已
   // 不是函数成为了对象的方法

   // 作为构造函数调用
   // 在函数调用之前加关键字 new
   // 函数构造器 --通过字符串创建函数
   // 构造函数--创建和初始化对象实例
   
   function nj(){
    this.skulk=function (){
      return this;
    }
   }
   var nj1=new nj();
   var nj2=new nj();
   console.log(nj1.skulk());
   console.log(nj1);
   console.log(nj2);
   console.log(nj2.skulk()===nj2);//true
   console.log(nj2.skulk()===nj1);//false
 // all nj{} 新构造的对象作为返回值











    </script>
</body>

</html>